#pragma once
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
using namespace std;

// 客户端发送请求
typedef struct request
{
    int x;
    int y;
    char op;

} request_t;

// 服务端做出响应(回应)
typedef struct response
{
    int code;   // code表示sever端计算的结果是否正确
    int result; // 表示计算的结果
} response_t;

//  request_t -> string
string SerializeRequest(const request_t &req)
{
    // 序列化
    Json::Value root; // 可以承装任何对象， json是一种kv式的序列化方案
    root["datax"] = req.x;
    root["datay"] = req.y;
    root["operator"] = req.op;

    Json::FastWriter writer;
    string json_string = writer.write(root);
    return json_string;
}

// string -> request_t
void DeserializeRequest(const string &json_string, request_t &out)
{
    // 反序列化
    Json::Reader reader;
    Json::Value root;

    reader.parse(json_string, root);
    out.x = root["datax"].asInt();
    out.y = root["datay"].asInt();
    out.op = (char)root["operator"].asInt();
}

string SerializeResponse(const response_t &resp)
{
    //序列化
    Json::Value root;
    root["code"] = resp.code;
    root["result"] = resp.result;

    Json::FastWriter writer;
    string res = writer.write(root);

    return res;
}

void DeserializeResponse(const string &json_string, response_t &out)
{
    // 反序列化
    Json::Reader reader;
    Json::Value root;

    reader.parse(json_string, root);
    out.code = root["code"].asInt();
    out.result = root["result"].asInt();
}
